
package edu.uoc.tds.pec4.swingx;

import edu.uoc.tds.pec4.common.RemotoInterface;
import edu.uoc.tds.pec4.i18n.GestorIdiomas;
import edu.uoc.tds.pec4.model.ParticipantesEstadistica;
import edu.uoc.tds.pec4.model.PruebaDetalleEstadistico;
import edu.uoc.tds.pec4.model.Usuario;
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.rmi.RemoteException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import javax.swing.InputVerifier;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFormattedTextField;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.JToolBar;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableModel;
import javax.swing.text.MaskFormatter;

/**
 *
 * @author TdsSoft
 */
public class PantallaEstadisticaPruebasFinalizadas extends javax.swing.JDialog {
    private static final long serialVersionUID = 1L;
    private Usuario usuario;
    private RemotoInterface remoto;
    private JToolBar jToolBarraHerramientas;
    private JPanel panelTitulo;
    private JLabel labelTitulo;
    private JButton jButtonSalir;
    
    private JPanel panelCriterios;
    private JPanel panelDatosPrueba;
    private JLabel labelPruebasRonda;
    private JComboBox comboBoxPruebasRondas;
    private JLabel labelFechaDesde;
    private JFormattedTextField textFechaDesde;
    private JLabel labelFechaHasta;
    private JFormattedTextField textFechaHasta;
    private JButton jButtonBuscar;
    private JLabel labelPrueba;
    private JTextField textPrueba;
    private JLabel labelTipoRonda;
    private JTextField textTipoRonda;
    private JLabel labelPlazas;
    private JTextField textPlazas;
    private JLabel labelPreguntas;
    private JTextField textPreguntas;
    private JLabel labelRespuestas;
    private JTextField textRespuestas;
    private JLabel labelFechasRealizacion;
    private JTextField textFechasRealizacion;    
    private JTable tableResultadoParticipante;
    private DefaultTableModel resultadoParticipanteDatos;
    private JScrollPane scroll;
    
    
    public PantallaEstadisticaPruebasFinalizadas (PantallaMenuPrincipal parent, boolean modal) throws RemoteException {
        super(parent, modal);
        this.remoto = parent.getRemoto();
        this.usuario = parent.getUsuario();
        initComponents();
        cargaPruebas();
    }
    
    private void initComponents(){
        setLayout(null);
        Container contenedor = getContentPane();
        contenedor.setLayout(null);
        contenedor.add(getJToolBarraHerramientas());
        contenedor.add(getPanelTitulo());
        contenedor.add(getPanelCriterios());
        contenedor.add(getPanelDatosPrueba());
        panelCriterios.add(getLabelPruebasRonda());
        panelCriterios.add(getComboBoxPruebasRondas());
        panelCriterios.add(getLabelFechaDesde());
        panelCriterios.add(getTextFechaDesde());
        panelCriterios.add(getLabelFechaHasta());
        panelCriterios.add(getTextFechaHasta());
        panelCriterios.add(getButtonBuscar());
        
        panelDatosPrueba.add(getLabelPrueba());
        panelDatosPrueba.add(getTextPrueba());
        panelDatosPrueba.add(getLabelTipoRonda());
        panelDatosPrueba.add(getTextTipoRonda());
        panelDatosPrueba.add(getLabelPlazas());
        panelDatosPrueba.add(getTextPlazas());
        panelDatosPrueba.add(getLabelPreguntas());
        panelDatosPrueba.add(getTextPreguntas());
        panelDatosPrueba.add(getLabelRespuestas());
        panelDatosPrueba.add(getTextRespuestas());
        panelDatosPrueba.add(getLabelFechasRealizacion());
        panelDatosPrueba.add(getTextFechasRealizacion());
        
        
        
        
        panelTitulo.add(getJLabelTitulo());
        add(getJscrollDetalle());
        pack();
        setSize(875,680);
        setTitle(GestorIdiomas.getMessage("PantallaPruebasFinalizadas.Titulo"));
    }
    
    private JPanel getPanelTitulo(){
        panelTitulo = new JPanel();
        panelTitulo.setBounds(30, 50, 795, 50);
        panelTitulo.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));
        panelTitulo.setLayout(null);
        return panelTitulo;
    }
    
        private JPanel getPanelCriterios(){
        panelCriterios = new JPanel();
        panelCriterios.setBorder(javax.swing.BorderFactory.createTitledBorder(null, GestorIdiomas.getMessage("PantallaPruebasFinalizadas.TituloPanelCriterios"), javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Arial", 1, 14), null));
        panelCriterios.setBounds(30, 120, 795, 70);
        panelCriterios.setLayout(null);
        return panelCriterios;
    }

        private JPanel getPanelDatosPrueba(){
        panelDatosPrueba = new JPanel();
        panelDatosPrueba.setBounds(30, 210, 795, 110);
        panelDatosPrueba.setBorder(javax.swing.BorderFactory.createTitledBorder(null, GestorIdiomas.getMessage("PantallaPruebasFinalizadas.TituloPanelDatosPrueba") , javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Arial", 1, 14), null));
        panelDatosPrueba.setLayout(null);
        return panelDatosPrueba;
    }

    private JToolBar getJToolBarraHerramientas(){
        jToolBarraHerramientas = new JToolBar();
        jToolBarraHerramientas.add(getJButtonSalir());
        jToolBarraHerramientas.setRollover(true);
        jToolBarraHerramientas.setName(GestorIdiomas.getMessage("PantallaPruebasFinalizadas.JToolBarraHerramientas")); 
        jToolBarraHerramientas.setRollover(true);
        jToolBarraHerramientas.setBounds(10, 10, 50, 30);
        return jToolBarraHerramientas;
    }
        
    private JButton getJButtonSalir(){
        jButtonSalir = new JButton();
        jButtonSalir.setIcon(new javax.swing.ImageIcon(getClass().getResource("/icons/Exit.png")));
        jButtonSalir.setFocusable(false);
        jButtonSalir.setBounds(0, 0, 30, 30);
        jButtonSalir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonSalirActionPerformed(evt);
            }
        });
        return jButtonSalir;
    }
        
    private JLabel getJLabelTitulo(){
        labelTitulo = new JLabel(GestorIdiomas.getMessage("PantallaPruebasFinalizadas.JLabelTitulo"), JLabel.CENTER);
        labelTitulo.setBounds(0, 15, 790, 20);
        labelTitulo.setFont( new Font("Arial",Font.BOLD,18 ));
        labelTitulo.setForeground(Color.BLUE);
        labelTitulo.setHorizontalAlignment(SwingConstants.CENTER);
        return labelTitulo;
    }
        
    private void jButtonSalirActionPerformed(java.awt.event.ActionEvent evt) {                              
        this.setVisible(false);
    }
    
    private JLabel getLabelPruebasRonda(){
        labelPruebasRonda = new JLabel();
        labelPruebasRonda.setBounds(10, 30, 100, 22);
        labelPruebasRonda.setText(GestorIdiomas.getMessage("PantallaPruebasFinalizadas.LabelPruebasRonda"));
        labelPruebasRonda.setEnabled(true);
        return labelPruebasRonda;
    }
    
    private JComboBox getComboBoxPruebasRondas() {
        comboBoxPruebasRondas = new JComboBox();
        comboBoxPruebasRondas.setEnabled(true);
        comboBoxPruebasRondas.setBounds(90, 30, 260, 22);
        comboBoxPruebasRondas.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                comboBoxPruebasRondas(evt);
            }
        });
    return comboBoxPruebasRondas;
}
    
   private JLabel getLabelFechaDesde(){
        labelFechaDesde = new JLabel();
        labelFechaDesde.setBounds(365, 30, 130, 22);
        labelFechaDesde.setText(GestorIdiomas.getMessage("PantallaPruebasFinalizadas.LabelFechaDesde"));
        labelFechaDesde.setEnabled(true);
        return labelFechaDesde;
    }
   
   private JFormattedTextField getTextFechaDesde(){
       try{
            MaskFormatter mascara = new MaskFormatter("##/##/####");
            mascara.setPlaceholderCharacter('_');
            textFechaDesde = new JFormattedTextField(mascara);
        }
        catch (Exception e)
        {
            JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("PantallaPruebasFinalizadas.ErrorMascara"), GestorIdiomas.getMessage("ShowMessageDialog.Error"), 0);
        } 
       textFechaDesde.setBounds(480, 30, 70, 22);
       textFechaDesde.setEnabled(true);
       textFechaDesde.setInputVerifier(new InputVerifier() {
            public boolean verify(JComponent input) {
                JFormattedTextField tf = (JFormattedTextField) input;
                String cadena = tf.getText();
                return controlFechas(cadena);
           }
       });
       return textFechaDesde;
   }

   private JLabel getLabelFechaHasta(){
        labelFechaHasta = new JLabel();
        labelFechaHasta.setBounds(560, 30, 130, 22);
        labelFechaHasta.setText(GestorIdiomas.getMessage("PantallaPruebasFinalizadas.LabelFechaHasta"));
        labelFechaHasta.setEnabled(true);
        return labelFechaHasta;
    }
    
   private JFormattedTextField getTextFechaHasta(){
       try{
            MaskFormatter mascara = new MaskFormatter("##/##/####");
            mascara.setPlaceholderCharacter('_');
            textFechaHasta = new JFormattedTextField(mascara);
        }
        catch (Exception e)
        {
            JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("PantallaPruebasFinalizadas.ErrorMascara"), GestorIdiomas.getMessage("ShowMessageDialog.Error"), 0);
        } 
       textFechaHasta.setBounds(675, 30, 70, 22);
       textFechaHasta.setEnabled(true);
       textFechaHasta.setInputVerifier(new InputVerifier() {
            public boolean verify(JComponent input) {
                JFormattedTextField tf = (JFormattedTextField) input;
                String cadena = tf.getText();
                return controlFechas(cadena);
           }
       });
       return textFechaHasta;
   }
   
       private JButton getButtonBuscar(){
        jButtonBuscar = new JButton();
        jButtonBuscar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/icons/Find.png")));
        jButtonBuscar.setFocusable(false);
        jButtonBuscar.setBounds(755, 26, 30, 30);
        jButtonBuscar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
               comboBoxPruebasRondas(evt);
            }
        });
        return jButtonBuscar;
    }

   private JLabel getLabelPrueba(){
        labelPrueba = new JLabel();
        labelPrueba.setBounds(10, 30, 50, 22);
        labelPrueba.setText(GestorIdiomas.getMessage("PantallaPruebasFinalizadas.LabelPrueba"));
        labelPrueba.setEnabled(true);
        return labelPrueba;
   }
   
   private JTextField getTextPrueba(){
        textPrueba = new JTextField();
        textPrueba.setEnabled(false);
        textPrueba.setBounds(60, 30, 170, 22);
        return textPrueba;
   }
   
   private JLabel getLabelTipoRonda(){
        labelTipoRonda = new JLabel();
        labelTipoRonda.setBounds(265, 30, 100, 22);
        labelTipoRonda.setText(GestorIdiomas.getMessage("PantallaPruebasFinalizadas.LabelTipoRonda"));
        labelTipoRonda.setEnabled(true);
        return labelTipoRonda;       
   }
   
   private JTextField getTextTipoRonda(){
        textTipoRonda = new JTextField();
        textTipoRonda.setEnabled(false);        
        textTipoRonda.setBounds(345, 30, 100, 22);
        return textTipoRonda;    
   }
   
   private JLabel getLabelFechasRealizacion(){
        labelFechasRealizacion = new JLabel();
        labelFechasRealizacion.setBounds(465, 30, 130, 22);
        labelFechasRealizacion.setText(GestorIdiomas.getMessage("PantallaPruebasFinalizadas.LabelFechasRealizacion"));
        labelFechasRealizacion.setEnabled(true);
        return labelFechasRealizacion;       
   }
   
   private JTextField getTextFechasRealizacion(){
        textFechasRealizacion = new JTextField();
        textFechasRealizacion.setEnabled(false);        
        textFechasRealizacion.setBounds(585, 30, 150, 22);
        return textFechasRealizacion;       
   }
   
   private JLabel getLabelPlazas(){
        labelPlazas = new JLabel();
        labelPlazas.setBounds(10, 70, 80, 22);
        labelPlazas.setText(GestorIdiomas.getMessage("PantallaPruebasFinalizadas.LabelPlazas"));
        labelPlazas.setEnabled(true);
        return labelPlazas;       
   }
   
   private JTextField getTextPlazas(){
        textPlazas = new JTextField();
        textPlazas.setEnabled(false);        
        textPlazas.setBounds(90, 70, 80, 22);
        return textPlazas;       
   }
   
   private JLabel getLabelPreguntas(){
        labelPreguntas = new JLabel();
        labelPreguntas.setBounds(265, 70, 100, 22);
        labelPreguntas.setText(GestorIdiomas.getMessage("PantallaPruebasFinalizadas.LabelPreguntas"));
        labelPreguntas.setEnabled(true);
        return labelPreguntas;       
   }
   
   private JTextField getTextPreguntas(){
        textPreguntas = new JTextField();
        textPreguntas.setEnabled(false);        
        textPreguntas.setBounds(345, 70, 80, 22);
        return textPreguntas;       
   }
   
   private JLabel getLabelRespuestas(){
        labelRespuestas = new JLabel();
        labelRespuestas.setBounds(465, 70, 80, 22);
        labelRespuestas.setText(GestorIdiomas.getMessage("PantallaPruebasFinalizadas.LabelRespuestas"));
        labelRespuestas.setEnabled(true);
        return labelRespuestas;       
   }
   
   private JTextField getTextRespuestas(){
        textRespuestas = new JTextField();
        textRespuestas.setEnabled(false);        
        textRespuestas.setBounds(550, 70, 230, 22);
        return textRespuestas;       
   }
    
    private JScrollPane getJscrollDetalle(){
         scroll = new JScrollPane();
         scroll.setViewportView(getTableDetallePrueba());
         scroll.setBounds(5, 350, 845, 270);
         return scroll;
    }
    
    private JTable getTableDetallePrueba(){
         resultadoParticipanteDatos = new DefaultTableModel();
         tableResultadoParticipante = new JTable(resultadoParticipanteDatos);
         resultadoParticipanteDatos.addColumn (GestorIdiomas.getMessage("PantallaPruebasFinalizadas.TableParticipante"));
         resultadoParticipanteDatos.addColumn (GestorIdiomas.getMessage("PantallaPruebasFinalizadas.TableOrden"));
         resultadoParticipanteDatos.addColumn (GestorIdiomas.getMessage("PantallaPruebasFinalizadas.TableUniversidad"));
         resultadoParticipanteDatos.addColumn (GestorIdiomas.getMessage("PantallaPruebasFinalizadas.TableFechaHoraEnvio"));
         resultadoParticipanteDatos.addColumn (GestorIdiomas.getMessage("PantallaPruebasFinalizadas.TableAciertos"));
         resultadoParticipanteDatos.addColumn (GestorIdiomas.getMessage("PantallaPruebasFinalizadas.TableFallos"));
         resultadoParticipanteDatos.addColumn (GestorIdiomas.getMessage("PantallaPruebasFinalizadas.TableEnBlaco"));
         resultadoParticipanteDatos.addColumn (GestorIdiomas.getMessage("PantallaPruebasFinalizadas.TablePuntuacion"));
         tableResultadoParticipante.setEnabled(false); 
         tableResultadoParticipante.getColumnModel().getColumn(0).setPreferredWidth(200);
         tableResultadoParticipante.getColumnModel().getColumn(1).setPreferredWidth(15);
         tableResultadoParticipante.getColumnModel().getColumn(2).setPreferredWidth(150);
         tableResultadoParticipante.getColumnModel().getColumn(3).setPreferredWidth(70);
         tableResultadoParticipante.getColumnModel().getColumn(4).setPreferredWidth(20);
         tableResultadoParticipante.getColumnModel().getColumn(5).setPreferredWidth(15);
         tableResultadoParticipante.getColumnModel().getColumn(6).setPreferredWidth(20);
         tableResultadoParticipante.getColumnModel().getColumn(7).setPreferredWidth(30);
         
         return tableResultadoParticipante;
    }

    private boolean controlFechas(String cadena){
        Boolean Salida = true;
        String[] aFecha;
        int dia = 0;
        int mes = 0;
        int anio = 0;
        if (cadena.trim().length() > 0){
            aFecha = cadena.trim().split("/");
            if ( !"__/__/____".equals(cadena)){ 
                try{
                    dia = Integer.parseInt(aFecha[0]);
                    mes = Integer.parseInt(aFecha[1]);
                    anio = Integer.parseInt(aFecha[2]);
                }catch(Exception e){
                    Salida = false;
                }
                Salida = esFechaValida(anio,mes,dia);
            }
        }
        if (Salida== false){
            JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("PantallaPruebasFinalizadas.ErrorFechaIncorrecta"), GestorIdiomas.getMessage("ShowMessageDialog.Error"), 0);
        }
        return Salida;
    }
    
    private boolean esFechaValida(int anio, int mes, int dia){
        boolean valida = anio > 0 && 1 <= mes && mes <= 12;
        if (valida) {
            switch (mes) {
            case 4: case 6: case 9: case 11:
                valida = 1 <= dia && dia <= 30;
                break;
            case 1: case 3: case 5: case 7: case 8: case 10: case 12:
                valida = 1 <= dia && dia <= 31;
                break;
            case 2:
                if (!esBisiesto(anio)) {
                    valida = 1 <= dia && dia <= 28;
                } else {
                    valida = 1 <= dia && dia <= 29;
                }
                break;
            }        
        }
        return valida;
    }
    
    private boolean esBisiesto(int anio){
        return (anio % 4 == 0 && !(anio % 100 == 0 && anio % 400 == 0));
    }  
    
    
    private void cargaPruebas(){
        List<PruebaDetalleEstadistico> listaPruebaDetalleEstadistico = new ArrayList<PruebaDetalleEstadistico>();
        try{
            listaPruebaDetalleEstadistico = remoto.obtenerPruebaDetalleEstadistico();
            for (int i = 0; i < listaPruebaDetalleEstadistico.size(); i++) {
                comboBoxPruebasRondas.addItem(listaPruebaDetalleEstadistico.get(i));
            }
        }
        catch (RemoteException ex) {
            JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("PantallaPruebasFinalizadas.ErrorObjetoRemotoPruebas"), GestorIdiomas.getMessage("ShowMessageDialog.Error"), 0);
        }
    }
    
    private void obtenerParticipantes(){
        PruebaDetalleEstadistico p = (PruebaDetalleEstadistico) comboBoxPruebasRondas.getSelectedItem();
        int idPrueba = p.getId_prueba();
        int idTipo = p.getId_tipo_ronda();
        List<ParticipantesEstadistica> listaParticipantes = new ArrayList<ParticipantesEstadistica>();
        int c = resultadoParticipanteDatos.getRowCount();
        if(c>0){
            for (int i = c-1; i >= 0; i--) {
                resultadoParticipanteDatos.removeRow(i);
            }
        }
        try {
            listaParticipantes = remoto.obtenerParticipantes(idPrueba, idTipo, textFechaDesde.getText(),textFechaHasta.getText());
            Object[] objetoResultadosParticipante = new Object[8];
            for (int i = 0; i < listaParticipantes.size(); i++) {
                objetoResultadosParticipante[0] = listaParticipantes.get(i).getNombreCompleto();
                objetoResultadosParticipante[1] = listaParticipantes.get(i).getClasificacion();
                objetoResultadosParticipante[2] = listaParticipantes.get(i).getUniversidad();
                if (listaParticipantes.get(i).getFechaPresentacion() != null){
                    SimpleDateFormat formatoFecha = new SimpleDateFormat("dd/MM/yyyy hh:mm");
                    objetoResultadosParticipante[3] = formatoFecha.format(listaParticipantes.get(i).getFechaPresentacion());
                }else{
                    objetoResultadosParticipante[3] = listaParticipantes.get(i).getFechaPresentacion();
                }
                objetoResultadosParticipante[4] = listaParticipantes.get(i).getAciertos();
                objetoResultadosParticipante[5] = listaParticipantes.get(i).getFallos();
                objetoResultadosParticipante[6] = listaParticipantes.get(i).getEnBlaco();
                objetoResultadosParticipante[7] = listaParticipantes.get(i).getPuntuacion();
                resultadoParticipanteDatos.addRow(objetoResultadosParticipante);
            }
        } catch (RemoteException ex) {
            JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("PantallaPruebasFinalizadas.ErrorObjetoRemotoParticipantes"), GestorIdiomas.getMessage("ShowMessageDialog.Error"), 0);
        }
    }
    
    private void comboBoxPruebasRondas(java.awt.event.ActionEvent evt){
        if (controlFechas(textFechaHasta.getText()) && controlFechas(textFechaDesde.getText())){
            PruebaDetalleEstadistico p = (PruebaDetalleEstadistico) comboBoxPruebasRondas.getSelectedItem();
            if (p != null){
                textPrueba.setText(p.getDescripcionPrueba());
                textTipoRonda.setText(p.getDescripcionTipoRonda());
                textPlazas.setText(Integer.toString(p.getParticipantes()));
                textPreguntas.setText(Integer.toString(p.getNumeroPreguntas()));
                String Resp="";
                char[] cR = p.getRespuestas().toCharArray();
                int lim =cR.length;
                for (int i=0; i<lim; i++){
                    if (cR[i]=='0'){cR[i]=' ';}
                    Resp = Resp + cR[i];
                    if (i<lim-1) {Resp = Resp + "-";}
                }
                textRespuestas.setText(Resp);
                SimpleDateFormat formatoFecha = new SimpleDateFormat("dd/MM/yyyy");
                textFechasRealizacion.setText(GestorIdiomas.getMessage("PantallaPruebasFinalizadas.De") + " " + 
                                      formatoFecha.format(p.getFechaInicioRealizacion()) + " " +
                                      GestorIdiomas.getMessage("PantallaPruebasFinalizadas.A") + 
                                     formatoFecha.format(p.getFechaFinRealizacion()));
                obtenerParticipantes();
            }
        }
    }
    
}
